package lv.servidordisqueria.repositorio;

import java.sql.SQLException;
import java.util.List;

import lv.servidordisqueria.excepcion.DomainNoExistenteException;

/**
 * Repositorio generico de acceso a JBDC, en el se manejaran los mensajes de 
 * insercion, borrado, edicion y busquedas de las entidades genricas.
 * @param <Entity> domain que debe complir para poder accionar el repositorio
 */
public interface RepositorioJDBC<Entity> {
	
	/**
	 * Insertar una entidad
	 * @param entity entidad
	 * return Entity
	 * @throws SQLException por problemas es la base de datos
	 */
	public Entity insertar(Entity entity) throws SQLException, DomainNoExistenteException;
	
	/**
	 * Editar una entidad
	 * @param entity
	 * @throws SQLException por problemas es la base de datos
	 */
	public void editar(Entity entity) throws SQLException;
	
	/**
	 * Borra una entidad en forma logica, Habilitado en forma true.
	 * Actua en cascada.
	 * @param entity
	 * @throws SQLException por problemas es la base de datos
	 * @throws DomainNoExistenteException si no existe la entidad manda este error
	 */
	public void borrar(Entity entity) throws SQLException;
	
	/**
	 * Borra una entidad en forma fisica, La eleimina definitivamente
	 * de la base de datos. Actua en cascada.
	 * @param entity
	 * @throws SQLException
	 * @throws DomainNoExistenteException
	 */
	public void borradoFisico(Entity entity) throws SQLException;
	
	/**
	 * Busca todas las entidades
	 * @return la lista de entidades completas
	 * @throws SQLException por problemas es la base de datos
	 * @throws DomainNoExistenteException si no existe la entidad manda este error
	 */
	public List<Entity> buscarTodos()  throws SQLException, DomainNoExistenteException;
	
	/**
	 * busca una entidad por medio de un filtro de columna y valor
	 * @param columna por la cualse filtra
	 * @param valor de la columna filtrada.
	 * @return la lista de entidades encontradas
	 * @throws SQLException por problemas es la base de datos
	 * @throws DomainNoExistenteException si no existe la entidad manda este error
	 */
	public List<Entity> buscar(String columna, Object valor) throws SQLException, DomainNoExistenteException;
	
	/**
	 * Busca por el id de la entidad
	 * @param id
	 * @return la entidad encontrada
	 * @throws SQLException por problemas es la base de datos
	 * @throws DomainNoExistenteException si no existe la entidad manda este error
	 */
	public Entity buscarPorId(Integer id) throws SQLException, DomainNoExistenteException;
	
}
